package subway;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        try {
            SubwaySystem subwaySystem = new SubwaySystem();
            // 读取地铁数据
            subwaySystem.loadSubwayData("D:\\subway.txt");

            // 测试功能1：识别所有中转站
            testTransferStations(subwaySystem);

            // 测试功能2：查找距离小于n的站点
            testNearbyStations(subwaySystem);

            // 测试功能3：查找所有路径
            testFindAllPaths(subwaySystem);

            // 测试功能4：查找最短路径
            testShortestPath(subwaySystem);

            // 测试功能5：打印简洁路径
            testPrintConcisePath(subwaySystem);

            // 测试功能6：计算普通单程票费用
            testCalculateFare(subwaySystem);

            // 测试功能7：计算武汉通和日票费用
            testCalculateSpecialFares(subwaySystem);

        } catch (Exception e) {
            System.err.println("执行测试时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }

    // 测试功能1：识别所有中转站
    private static void testTransferStations(SubwaySystem subwaySystem) {
        System.out.println("\n=== 测试1: 识别所有中转站 ===");
        Map<String, Set<String>> transferStations = subwaySystem.findTransferStations();
        for (Map.Entry<String, Set<String>> entry : transferStations.entrySet()) {
            System.out.println("<" + entry.getKey() + "，<" + 
                String.join("、", entry.getValue()) + ">>");
        }
    }

    // 测试功能2：查找距离小于n的站点
    private static void testNearbyStations(SubwaySystem subwaySystem) {
        System.out.println("\n=== 测试2: 查找距离小于n的站点 ===");
        String startStation = "古田三路";
        double maxDistance = 1.0;
        List<NearbyStation> nearbyStations = subwaySystem.findNearbyStations(startStation, maxDistance);
        
        System.out.printf("%s，距离为%.1f的站点为<", startStation, maxDistance);
        for (int i = 0; i < nearbyStations.size(); i++) {
            NearbyStation ns = nearbyStations.get(i);
            System.out.printf("<%s，%s号线，%.1f>", ns.stationName, ns.line, ns.distance);
            if (i < nearbyStations.size() - 1) {
                System.out.print("，");
            }
        }
        System.out.println(">");
    }

    // 测试功能3：查找所有路径
    private static void testFindAllPaths(SubwaySystem subwaySystem) {
        System.out.println("\n=== 测试3: 查找所有路径 ===");
        String start = "天河机场";
        String end = "三店";
        List<List<String>> paths = subwaySystem.findAllPaths(start, end);
        
        System.out.printf("从%s到%s的所有路径:\n", start, end);
        for (int i = 0; i < paths.size(); i++) {
            System.out.printf("路径%d: %s\n", i + 1, String.join(" -> ", paths.get(i)));
        }
    }

    // 测试功能4：查找最短路径
    private static void testShortestPath(SubwaySystem subwaySystem) {
        System.out.println("\n=== 测试4: 查找最短路径 ===");
        String start = "天河机场";
        String end = "古田三路";
        List<String> shortestPath = subwaySystem.findShortestPath(start, end);
        
        System.out.printf("从%s到%s的最短路径: %s\n", start, end, String.join(" -> ", shortestPath));
    }

    // 测试功能5：打印简洁路径
    private static void testPrintConcisePath(SubwaySystem subwaySystem) {
        System.out.println("\n=== 测试5: 打印简洁路径 ===");
        
        // 测试1号线内的路径（无需换乘）
        String start1 = "径河";
        String end1 = "古田三路";
        System.out.printf("路径1: %s -> %s\n", start1, end1);
        subwaySystem.printConcisePath(start1, end1);
        
        // 测试跨线路的路径（需要换乘）
        String start2 = "古田四路";
        String end2 = "天河机场";
        System.out.printf("路径2: %s -> %s\n", start2, end2);
        subwaySystem.printConcisePath(start2, end2);
    }

    // 测试功能6：计算普通单程票费用
    private static void testCalculateFare(SubwaySystem subwaySystem) {
        System.out.println("\n=== 测试6: 计算普通单程票费用 ===");
        List<String> path = Arrays.asList("古田三路", "华中科技大学");
        double fare = subwaySystem.calculateFare(path);
        System.out.printf("路径%s的普通单程票费用: %.2f元\n", 
                          String.join(" -> ", path), fare);
    }

 // 测试功能7：计算武汉通和日票费用
    private static void testCalculateSpecialFares(SubwaySystem subwaySystem) {
        System.out.println("\n=== 测试7: 计算武汉通和日票费用 ===");
        List<String> path = Arrays.asList("径河站", "华中科技大学");
        double wuhanTongFare = subwaySystem.calculateWuhanTongFare(path);
        double dayTicketFare = subwaySystem.calculateDayTicketFare(path);
        
        // 修复：添加缺失的参数
        System.out.printf("路径%s的武汉通费用: %.2f元\n", 
                          String.join(" -> ", path), wuhanTongFare);
        // 添加日票费用的输出
        System.out.printf("路径%s的日票费用: %.2f元\n", 
                          String.join(" -> ", path), dayTicketFare);
    }
}